'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.04
 * lastUpdateDate：2018.02.04
 * description：Iterator遍历器与for-of循环的配合使用
 */
// 来看看怎么玩耍Iterator遍历器与for-of循环
/**
 * 数组有一个Symbol.iterator的属性，当我们调用它arr[Symbol.iterator]()，
 * 它会返回一个Iterator的指针对象，如下所示：
 * 那么它调用next方法会返回两个值，格式为：{ value: 'a', done: false }
 * value表示当前正在循环遍历的值，done为false表示循环还没结束，就得继续调用
 * next()方法，直到{ value: undefined, done: true }表示值已经遍历完毕
 */
/**
 * 我们可以直接对一个json进行iterator(迭代)
 */
var obj = {
    'allen' : '214913005',
    'xiaoyou' : '2470939843'
};

var obj2 = {
    'yucy' : '309544623',
    'feimao' : '2453481297'
};

let iteratorFunc = function () {
    // obj[Symbol.iterator]
    // console.log(this);
    var _this = this;

    /**
     * 注意：这些变量的定义必须在Symbol.iterator属性方法里来定义，
     * 我们要把每一次Iterator调用之后返回的Iterator的指针对象，保证
     * 每次调用都是一个全新的Iterator，所以说每次调用初始化的这些变量
     * 都要重新初始化
     *
     */
    // 给个初始值
    let i = 0;
    // 得到所有的names，类似上面的key(allen, xiaoyou)
    const names = Object.keys(this);
    const length = names.length;
    // console.log(names);

    // 返回的是iterator的一个指针对象
    return {
        next: function () {
            let name = names[i++];
            // next: [Function next] 这里的this指向有问题的
            // console.log(this);
            // let qq = this.users[name];
            let qq = _this[name];
            return {
                value : { name, qq },
                done : i > length
            };
        }
    }
};

obj[Symbol.iterator] = iteratorFunc;
obj2[Symbol.iterator] = iteratorFunc;

/**
 * for-of循环的优势就是既简便，可以中途跳出和停止循环又弥补
 * forEach那个方法的弊端，无法在中途跳出和停止循环
 */
for ( let o of obj ) console.log(o);
for ( let o of obj2 ) console.log(o);
